//package architect;
//
//import jodd.time.JulianDate;
//import lombok.Data;
//import org.apache.hadoop.conf.Configuration;
//import org.apache.hadoop.fs.Path;
//import org.apache.parquet.column.ParquetProperties;
//import org.apache.parquet.example.data.Group;
//import org.apache.parquet.example.data.simple.SimpleGroupFactory;
//import org.apache.parquet.hadoop.ParquetFileWriter;
//import org.apache.parquet.hadoop.ParquetWriter;
//import org.apache.parquet.hadoop.example.ExampleParquetWriter;
//import org.apache.parquet.hadoop.metadata.CompressionCodecName;
//import org.apache.parquet.io.api.Binary;
//import org.apache.parquet.schema.LogicalTypeAnnotation;
//import org.apache.parquet.schema.MessageType;
//import org.apache.parquet.schema.PrimitiveType;
//import org.apache.parquet.schema.Types;
//import org.joda.time.DateTime;
//import org.joda.time.DateTimeZone;
//
//import java.io.IOException;
//import java.nio.ByteBuffer;
//import java.nio.ByteOrder;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.time.ZonedDateTime;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.IntStream;
//
///**
// * @author guan.xin
// * @title HadoopParquetWriter
// * @description
// * @create 2022-04-14 22:52
// * @since JDK8
// */
//public class HadoopParquetWriter {
//
//    //表结构
//    private static final MessageType FILE_SCHEMA;
//    private static final String TABLE_NAME = "parquet_with_time";
//
//    static {
//        //定义表结构
//        Types.MessageTypeBuilder messageTypeBuilder = Types.buildMessage();
//        messageTypeBuilder
//                .optional(PrimitiveType.PrimitiveTypeName.BINARY)
//                .as(LogicalTypeAnnotation.stringType())
//                .named("name")
//                .optional(PrimitiveType.PrimitiveTypeName.INT32)
//                .named("age")
//                .optional(PrimitiveType.PrimitiveTypeName.INT96)
//                .named("create_time");
//        FILE_SCHEMA = messageTypeBuilder.named(TABLE_NAME);
//    }
//
//    /**
//     * 主函数
//     *
//     * @param args
//     */
//    public static void main(String[] args) throws IOException {
//        System.out.println("测试");
//        //获取数据数据
//        List<TestItem> testData = getTestData();
//        //写入数据
//        writeToFile(testData);
//    }
//
//    /**
//     * 写入数据
//     */
//    private static void writeToFile(List<TestItem> testItems) throws IOException {
//        //获取文件写入的目录
//        String filePath = "/warehouse/tablespace/managed/hive/test.db/parquet_with_time/p_" + System.currentTimeMillis();
//        //查看多条数据是否可以一次性写入一个Parquet文件
//        ParquetWriter<Group> writer = getWriter(filePath);
//        SimpleGroupFactory simpleGroupFactory = new SimpleGroupFactory(FILE_SCHEMA);
//        //校验目录
//        for (TestItem testItem : testItems) {
//            Group group = simpleGroupFactory.newGroup();
//            group.append("name", testItem.getName());
//            group.append("age", testItem.getAge());
//            group.append("create_time", Binary.fromConstantByteArray(getTimestamp(testItem.getCreateTime())));
//            writer.write(group);
//        }
//        writer.close();
//    }
//
//    /**
//     * Parquet写入配置
//     *
//     * @param filePath
//     * @return
//     * @throws IOException
//     */
//    private static ParquetWriter<Group> getWriter(String filePath) throws IOException {
//        Path path = new Path(filePath);
//        return ExampleParquetWriter.builder(path)
//                .withWriteMode(ParquetFileWriter.Mode.CREATE)
//                .withWriterVersion(ParquetProperties.WriterVersion.PARQUET_1_0)
//                .withCompressionCodec(CompressionCodecName.SNAPPY)
//                .withConf(getHdfsConfiguration())
//                .withType(FILE_SCHEMA).build();
//    }
//
//    /**
//     * 测试的表结构数据
//     */
//    @Data
//    private static class TestItem {
//        private String name;
//        private int age;
//        private Date createTime;
//    }
//
//    /**
//     * 测试数据
//     *
//     * @return
//     */
//    private static List<TestItem> getTestData() {
//        DateTime now = DateTime.now();
//        List<TestItem> testItems = new ArrayList<>();
//        IntStream.range(1, 6).forEach(i -> {
//            TestItem testItem = new TestItem();
//            testItem.setName("hdfs_" + i);
//            testItem.setAge(i + 10);
//            testItem.setCreateTime(now.minusHours(i).toDate());
//            testItems.add(testItem);
//        });
//        return testItems;
//    }
//
//    /**
//     * 将Date转换成时间戳
//     *
//     * @param date
//     * @return
//     */
//    private static byte[] getTimestamp(Date date) {
//        DateTime dateTime = new DateTime(date, DateTimeZone.UTC);
//        byte[] bytes = new byte[12];
//        LocalDateTime localDateTime = LocalDateTime.of(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth(),
//                dateTime.getHourOfDay(), dateTime.getMinuteOfHour(), dateTime.getSecondOfMinute());
//        //转纳秒
//        long nanos = dateTime.getHourOfDay() * TimeUnit.HOURS.toNanos(1)
//                + dateTime.getMinuteOfHour() * TimeUnit.MINUTES.toNanos(1)
//                + dateTime.getSecondOfMinute() * TimeUnit.SECONDS.toNanos(1);
//        //转儒略日
//        ZonedDateTime localT = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
//        ZonedDateTime utcT = localT.withZoneSameInstant(ZoneId.of("UTC"));
//        JulianDate julianDate = JulianDate.of(utcT.toLocalDateTime());
//        //写入INT96时间戳
//        ByteBuffer buffer = ByteBuffer.wrap(bytes);
//        buffer.order(ByteOrder.LITTLE_ENDIAN)
//                .putLong(nanos)//8位
//                .putInt(julianDate.getJulianDayNumber());//4位
//        return bytes;
//    }
//
//    /**
//     * hdfs配置
//     *
//     * @return
//     */
//    public static Configuration getHdfsConfiguration() {
//        //设置操作用户为hdfs用户
//        Configuration configuration = new Configuration();
//        System.setProperty("HADOOP_USER_NAME", "hdfs");
//        //配置连接
//        configuration.set("fs.defaultFS", "hdfs://192.168.11.240:8020");
//        return configuration;
//    }
//
//}
